/*
 * Copyright(C) 2010 Luvina Software Company
 *
 * GenericDaoImpl.java, Oct 29, 2010 ntmhuong
 */
package net.luvina.manageuser.dao.impl;

import java.io.Serializable;

import net.luvina.manageuser.dao.GenericDao;

import org.hibernate.LockMode;
import org.hibernate.SessionFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.orm.hibernate3.HibernateTemplate;

/**
 * 各Daoの親クラス用の汎用Dao
 *
 * @version $Rev$
 * @param <T>
 *            テーブル用DTOのクラス
 * @param <PK>
 *            PrimaryKeyのクラス
 */
public class GenericDaoImpl<T, PK extends Serializable> implements
        GenericDao<T, PK> {
    private Class<T> type;
    private HibernateTemplate hibernateTemplate;

    /**
     * テーブルの型指定
     *
     * @param type
     *            テーブル用DTOのクラス
     */
    public GenericDaoImpl(Class<T> type) {
        this.type = type;
    }

    /**
     * HibernateTemplate用のSessionFactoryを設定
     *
     * @param sessionFactory
     */
    @Autowired
    public void setSessionFactory(SessionFactory sessionFactory) {
        this.hibernateTemplate = new HibernateTemplate(sessionFactory);
    }

    /**
     * HibernateTemplate用のSessionFactoryを取得
     */
    public HibernateTemplate getHibernateTemplate() {
        return this.hibernateTemplate;
    }

    /**
     * HibernateTemplate.saveのラッパ
     *
     * @param o
     *            追加するデータ
     */
    @SuppressWarnings("unchecked")
    public PK create(T o) {
        return (PK) this.hibernateTemplate.save(o);
    }

    /**
     * HibernateTemplate.getのラッパ
     *
     * @param id
     *            PrimaryKey
     */
    public T read(PK id) {
        return (T) this.hibernateTemplate.get(this.type, id);
    }

    /**
     * HibernateTemplate.getのラッパ
     *
     * @param id
     *            PrimaryKey
     */
    public T read(PK id, LockMode lockMode) {
        return (T) hibernateTemplate.get(this.type, id, lockMode);
    }

    /**
     * HibernateTemplate.updateのラッパ
     *
     * @param o
     *            更新するデータ
     */
    public void update(T o) {
        this.hibernateTemplate.update(o);
    }

    /**
     * HibernateTemplate.deleteのラッパ
     *
     * @param o
     *            削除するデータ
     */
    public void delete(T o) {
        this.hibernateTemplate.delete(o);
    }
}